#ifndef MEMBERZKP_H
#define MEMBERZKP_H
#include <stdlib.h>
#include <inttypes.h>
#include <stdbool.h>
#ifdef __cplusplus
extern "C" {
#endif
void hszkp_initialize();
void hszkp_get_hash(void* pre_img,void* hash_digest);

/*zero knownledge proof of membership's api*/
void hszkp_membership_setup(uint64_t max_set_size);
bool hszkp_membership_prove(uint64_t max_set_size,void* set,uint64_t set_size,
                            void* member_sk,uint64_t seq_id,void* out_proof,void* proof_size,void*prove_key);
bool hszkp_membership_verify(void* proof_data,uint64_t proof_length,
                        uint64_t max_set_size,void* set,uint64_t set_size,uint64_t seq_id,void*verify_key);


/*zero knownledge proof of hash's api*/
void hszkp_hasher_setup();
bool hszkp_hasher_prove(void * pre_image,uint64_t seq_id,void* out_proof,void* proof_size,void*prove_key);
bool hszkp_hasher_verify(void* proof_data,uint64_t proof_length,void* hash_digest,uint64_t seq_id,void*verify_key);

/*zero knownledge proof of range's api*/
void hszkp_range_setup();
bool hszkp_range_prove(uint64_t range_max_number,uint64_t input_number,uint64_t seq_id,void* out_proof,void* proof_size);
bool hszkp_range_verify(void* proof_data,uint64_t proof_length,
                                 uint64_t range_max_number,uint64_t seq_id);
void hszkp_membership_setup2();
bool hszkp_membership_prove2(void* set,uint64_t set_size,void* member_sk,
									uint64_t seq_id,void* out_proof,void* proof_size);
bool hszkp_membership_verify2(void* proof_data,uint64_t proof_length,uint64_t seq_id,void* set,uint64_t set_size);


#ifdef __cplusplus
}
#endif
#endif


